import os, sys

import requests
import json

from pandas.core.computation.common import result_type_many

# 导入其他模块文件
project_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../database"))
if project_path not in sys.path:
    sys.path.append(project_path)

import database.database_mysql as db
import akshare as ak
import datetime
import utils.date_util as dt
import pandas as pd
import numpy as np
import stock as stock_method

# 股票
# 总市值 = 总股本 * 股价
# 流通市值 = 流通股本 * 股价
# 市净率也叫“市账率”，是普通股每股市价与每股净资产的比率，反映普通股股东愿意为每1元净资产支付的价格，也反映了市场对公司净资产质量的评价。
# 市净率的计算公式为：市净率＝每股市价÷每股净资产。其中：每股净资产＝普通股股东权益÷流通在外普通股股数。
# 市盈率是普通股每股市价与每股收益的比率，反映普通股股东愿意为每1元净利润支付的价格。
# 市盈率的计算公式为：市盈率＝每股市价÷每股收益。其中：每股收益=普通股股东净利润÷流通在外普通股加权平均股数。

# 互联网行业平均市盈率
# 静态市盈率（加权平均）	静态市盈率（中位数）	静态市盈率（算术平均）
# 30.89	60.25	120.63
# 总市值/上一年度净利润=sp*total/上一年度净利润

# 41.42 505.7
# 动态市盈率：-60.66 总市值/-6.27*3/4
# 总市值除以全年预估净利润，例如当前一季度净利润1000万,则预估全年净利润4000万
# ·静态市盈率：40.27 总市值/12.58
# 总市值除以上一年度净利润
# ·滚动市盈率：166.99 -0.51 -0.32 -0.15 1.05 0.28 41.42/(-0.51+1.05-0.28)
# 最新价除以最近4个季度的每股收益
def stock_analysis_pe(df: pd.DataFrame = None) -> pd.DataFrame:
    """
    分析数据
    :param df: 股票PE
    :type df: pandas.DataFrame
    :return: 指定 indicator 的数据
    :rtype: pandas.DataFrame
    """

    df.columns = ['code', 'name', 'type', 'sp', 'dt', 'total_value', 'nego_value', 'income', 'net_profits',
                  'eps', 'navps', 'pe', 'pe1', 'pe2', 'pe3', 'pb', 'sp1', 'sp2', 'sp3']

    total_bins = [0, 20, 40, 60, 80, 100, 200, 500, 1000, 5000]
    total_labels = ['0-20', '20-40', '40-60', '60-80', '80-100', '100-200', '200-500', '500-1000', '1000+']
    df['total_group'] = pd.cut(df['total_value'], bins=total_bins, labels=total_labels, right=False)
    # df['total_group'] = pd.qcut(df['total_value'], q=9, labels=total_labels)
    df = df.sort_values(by='total_group', ascending=False)
    # print(df)
    return df

def test_pe():
    file_path = os.path.dirname(os.getcwd()) + '/file/config/sql/'
    file_name = 'data.sql'
    # curr_date = dt.DateUtil().get_date_strftime(strftime='%Y%m%d')

    test = db.MySQLHandler()

    with open(file_path+file_name, 'r') as file:
        sql = file.read()

    data = test.fetch_all(sql)
    # df = pd.DataFrame(data).iloc[:1]
    df = pd.DataFrame(data)
    # df = pd.read_excel(file_path+file_name, converters={'code':str})

    data_df = stock_analysis_pe(df)

    data_df.to_excel(os.path.dirname(os.getcwd()) +'/file/data/多元金融.xlsx', index=False)

def test_short():
    """
    一夜持股：尾盘15分钟进场，次日开盘半小时离场
    1、查看涨幅排行榜，选3-5%的股
    2、按量比进行排序，将量比<1剔除
    3、看换手率，去除<5%和>10%
    4、看流通市值，去除<40亿和>200亿
    5、看成交量，找到持续放量的品种
    6、看k线形态，高位长上影，短期压力大的不要，短期见顶概率大
    7、看分时图，股价全天运行，在分时均线上方，走势强于大盘，代表个股主动性强，2.30附近创出新高，回踩不破均线企稳，就是进场时间
    8、第2天2-4%离场
    """
    # stock_spot_df = pd.read_excel(os.path.dirname(os.getcwd()) + '/file/data/stock.xlsx', converters={'代码': str})
    stock_spot_df = ak.stock_zh_a_spot_em()
    df_step_1 = stock_spot_df.query('涨跌幅 > 3 and 涨跌幅 < 5')
    df_step_2 = df_step_1.query('量比 >= 1')
    df_step_3 = df_step_2.query('换手率 >= 5 and 换手率 <= 10')
    df_step_4 = df_step_3.query('流通市值 >= 4000000000 and 流通市值 <= 20000000000')
    df_step_5 = df_step_4.query('成交量 >= 500000')
    # df_step_5 = pd.read_excel(os.path.dirname(os.getcwd()) + '/file/data/stock_short230.xlsx', converters={'代码': str})
    df_step_6 = df_step_5[~df_step_5['代码'].str.startswith('688')]
    df_step_7 = df_step_6[~df_step_6['代码'].str.startswith('30')]
    df_step_8 = df_step_7.apply(lambda x : cal_cj(x), axis=1)
    df_step_9 = df_step_8.sort_values(by='成交量', ascending=False)
    df_step_9.to_excel(os.path.dirname(os.getcwd()) + '/file/data/stock_short230.xlsx', index=False)

def cal_cj(row):
    # print(row)
    curr_date = dt.DateUtil().get_date_strftime(interval=-1, strftime='%Y%m%d')
    last_date = dt.DateUtil().get_date_strftime(interval=-7, strftime='%Y%m%d')
    stock_zh_a_hist_df = stock_method.stock_his_data(symbol=row['代码'], start_date=last_date, end_date=curr_date, adjust='qfq')

    cj_avg = round(stock_zh_a_hist_df['cj_num'].mean(), 0)
    cj_last = stock_zh_a_hist_df.loc[4, 'cj_num']
    row['近7天平均成交量'] = cj_avg
    row['较近7天平均幅度%'] = round((row['成交量'] - cj_avg) / cj_avg, 2)
    row['昨日成交量'] = cj_last
    row['较昨日幅度%'] = round((row['成交量'] - cj_last) / cj_last, 2)
    return row

# test_pe()
test_short()

# stock_spot_df = ak.stock_zh_a_spot_em()
# stock_spot_df.to_excel(os.path.dirname(os.getcwd()) + '/file/data/stock.xlsx', index=False)